package com.zzyl.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zzyl.base.PageResponse;
import com.zzyl.constant.SuperConstant;
import com.zzyl.dto.RoleDto;
import com.zzyl.entity.Role;
import com.zzyl.entity.RoleResource;
import com.zzyl.mapper.RoleMapper;
import com.zzyl.mapper.RoleResourceMapper;
import com.zzyl.service.RoleService;
import com.zzyl.utils.EmptyUtil;
import com.zzyl.utils.ObjectUtil;
import com.zzyl.vo.RoleVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class RoleServiceImpI implements RoleService {
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private RoleResourceMapper roleResurceMapper;

    //分页查询
    @Override
    public PageResponse<RoleVo> findRoleVoPage(RoleDto roleDto, Integer pageNum, Integer pageSize) {
       // 使用 PageHelper 开启分页功能，设置当前页码和每页大小
         PageHelper.startPage(pageNum,pageSize);
        // 调用 roleMapper 的 selectPage 方法进行分页查询，返回一个 Page 对象
        Page<Role> page = roleMapper.selectPage(roleDto);
        // 将查询得到的 Page 对象转换为 PageResponse 对象，并指定数据项类型为 RoleVo
        PageResponse<RoleVo> pageResponse = PageResponse.of(page, RoleVo.class);
        // 返回转换后的 PageResponse 对象
        return pageResponse;
    }
    //添加角色
    @Override
    @Transactional
    public int createRole(RoleDto roleDto) {
        Role role = BeanUtil.toBean(roleDto, Role.class);
       return roleMapper.insert(role);

    }
//修改角色
    @Override
    public Boolean updateRole(RoleDto roleDto) {
        //1、类型转换
        Role role = BeanUtil.toBean(roleDto, Role.class);
        //角色是否关联用户，如果关联，则不能禁用
        //2、调用修改角色的mapper
        roleMapper.updateByPrimaryKeySelective(role);
        //3、判断是否修改角色对应的资源数据
        if (ObjectUtil.isEmpty(roleDto.getCheckedResourceNos())){
            //如果为空，表示没有资源权限，则直接返回，不可以没有权限
            return true;
        }
        //4、否则不为空，则进行修改，先删除原有角色资源中间信息，然后再新增角色资源中间信息
        //4、1删除原有角色资源中间信息
        roleResurceMapper.deleteRoleResourceByRoleId(role.getId());
        //4、2批量新增角色资源中间信息
        //4.2.2定义一个空list用来存储角色资源实体对象
        List<RoleResource>resourceList=new ArrayList<>();
        //4.2.3遍历封装数据
        String [] checkedResourceNos=roleDto.getCheckedResourceNos();
        List<String> resourceNolist = Arrays.asList(checkedResourceNos);
        resourceNolist.forEach(resourceNo->{
            RoleResource roleResource= RoleResource.builder().roleId(role.getId()).resourceNo(resourceNo).dataState(SuperConstant.DATA_STATE_0).build();
             resourceList.add(roleResource);
        });
        //如果集合为空，则结束请求
        if (EmptyUtil.isNullOrEmpty(resourceList)){
            return true;

        }
        //4.2.1调用批量新增中间表
        roleResurceMapper.batchInsert(resourceList);
        return true;
    }
//删除角色
    @Override
    public Object deleteRoleById(Long roleId) {
        //删除角色相关的菜单
        roleResurceMapper.deleteRoleResourceByRoleId(roleId);
        //删除角色数据
       return roleMapper.deleteByPrimaryKey(roleId);

    }

}
